﻿#ifndef Telegram_h__
#define Telegram_h__

/********************************************************************
	创建于:		2011/04/04
	创建于:		4:4:2011   14:07
	基本文件:	Telegram
	文件扩展:	h
	作者:		王凯
	
	目的:		定义通信结构。通讯类通过传递该结构来实现通讯。
*********************************************************************/

#include <iostream>
#include <cmath>

struct Telegram
{
	//发送者
	int Sender;

	//接收者
	int Receiver;

	//消息内容（预定义）
	int Msg;

	//消息延迟时间。如果为0则为立即消息，否则为延迟消息。
	double DispatchTime;

	//预留以提供扩展
	void* ExtraInfo;

	//默认的构造
	Telegram():
	DispatchTime(-1),
		Sender(-1),
		Receiver(-1),
		Msg(-1){}

	//带参数的构造
	Telegram(double dt, 
		int s,
		int r,
		int m,
		void* e = NULL):
	DispatchTime(dt),
		Sender(s),
		Receiver(r),
		Msg(m),
		ExtraInfo(e){}
};

const double SmallestDelay = 0.25;

inline bool operator==(const Telegram& lhs, const Telegram& rhs)
{
	return ((fabs(rhs.DispatchTime- lhs.DispatchTime) < SmallestDelay) &&
		(rhs.Sender == lhs.Sender) &&
		(rhs.Receiver == lhs.Receiver) &&
		(rhs.Msg == lhs.Msg));
}

inline bool operator<(const Telegram& lhs, const Telegram& rhs)
{
	if(rhs == lhs)
		return false;
	else
		return(lhs.DispatchTime < rhs.DispatchTime);
}

inline std::ostream& operator<<(std::ostream& os, const Telegram& t)
{
	os<<"时间："<<t.DispatchTime<<" 发送者："<<t.Sender<<" 接收者："<<t.Receiver
		<<" 消息："<<t.Msg;
	return os;
}

//一个很好的方法，可以把p指针解引用返回
template<typename T>
inline T DereferenceToType(void* p)
{
	return *(*T)p;
}
#endif // Telegram_h__